package icu.lookyousmileface.forkjoin;

import java.util.concurrent.RecursiveTask;

/**
 * @author starrysky
 * @title: MyForkJoinTask
 * @projectName Juc_Pro
 * @description: ForkJon,必须要继承RecursiceTask
 *  * 求和计算的任务！
 *  * 3000   6000（ForkJoin）  9000（Stream并行流）
 *  * // 如何使用 forkjoin
 *  * // 1、forkjoinPool 通过它来执行
 *  * // 2、计算任务 forkjoinPool.execute(ForkJoinTask task)
 *  * // 3. 计算类要继承 ForkJoinTask
 * @date 2021/1/301:11 上午
 */
class MyForkJoinTask extends RecursiveTask<Long> {
    //开始和结束位置数
    private Long start;
    private Long end;
    //临界值
    private Long temp = 10000L;

    public MyForkJoinTask(Long start, Long end) {
        this.start = start;
        this.end = end;
    }
    //计算方法
    @Override
    protected Long compute() {
        //小于临界值就进行计算不拆分
        if ((end-start)<temp){
            Long sum = 0L;
            for (Long i = start; i <= end; i++) {
                sum += i;
            }
            return sum;
        }else {
            //取中位数
            Long mdie = (start+end)/2;
            MyForkJoinTask task1 = new MyForkJoinTask(start, mdie);
            //拆分任务，把任务压入线程队列
            task1.fork();
            MyForkJoinTask task2 = new MyForkJoinTask(mdie + 1, end);
            //拆分任务，把任务压入线程队列
            task2.fork();
            //结果汇聚
            return task1.join()+task2.join();
        }
    }
}
